Cargamos los datos.

Añadimos la primera columna del dataframe, los distritos. También la población de cada distrito y el porcentaje de extranjeros (https://www.idescat.cat/poblacioestrangera/?geo=mun%3A080193&b=10&lang=es&t=2019).

distrito <-filter(b_persRespuestas, Nom_variable == 'DISTRICTE')
df<-data.frame(distrito = distrito$Resposta) 
pop <- fread('Poblacion2018.csv', encoding= 'Latin-1')
df <- cbind(df, pop[1:10,2],pop[1:10,5])
names(df)[2] = "pop"
names(df)[3] = "porex" #porcentaje de extranjeros
distrito <- NULL
pop <- NULL

for(j in 1:nrow(df)){
    df[j,3]<-str_replace_all(df[j,3],"[[:punct:]]", ".")}
df[,3]<-as.numeric(df[,3])

Delitos cometidos en es distrito.

temp<-as.data.frame(table(hechos$DISTRICTE_FET))
temp<-temp[c(1:5,9:13),]
temp[,1]<-sort(temp[,1]) #Ordenamos para añadir los datos
df <- df[order(df$distrito), ]
df <- cbind(df,temp$Freq)
names(df)[4] = "frec_delitos_lug" #Delitos cometidos en ese distrito

Víctimas residentes en cada distrito.

temp<-hechos %>%
    group_by(NUMQ) %>%
    slice(1)
temp<-temp %>%  
   group_by(DISTRICTE_RES) %>% 
   summarise(n = n())
df <- cbind(df,temp$n)
names(df)[5] = "Victimas_res" # Víctimas en cada distrito

Número de encuestados por distrito.

temp<-personas %>%  
   group_by(DISTRICTE) %>% 
   summarise(n = n())
df <- cbind(df,temp$n)
names(df)[6] = "encuestadosXdis" # Encuestadxs en cada distrito

Valoración de los mossos, la guardia urbana, la seguridad en el barrio de residencia y la seguridad de Barcelona en general.

temp<-personas[,c(1,6,78:81)]
temp <- temp %>%
  mutate(VAL_MOSSOS = ifelse(VAL_MOSSOS == "0 = DONEN UN SERVEI PÈSSIM",0, VAL_MOSSOS)) %>%
  mutate(VAL_MOSSOS = ifelse(VAL_MOSSOS == "10 = DONEN UN SERVEI EXCEL·LENT",10, VAL_MOSSOS)) %>%
  mutate(VAL_MOSSOS = ifelse(VAL_MOSSOS == "NO HO SAP",NA, VAL_MOSSOS)) %>%
  mutate(VAL_MOSSOS = ifelse(VAL_MOSSOS == "NO CONTESTA",NA, VAL_MOSSOS)) %>%
  mutate(VAL_GUB = ifelse(VAL_GUB == "0 = DONEN UN SERVEI PÈSSIM",0, VAL_GUB)) %>%
  mutate(VAL_GUB = ifelse(VAL_GUB == "10 = DONEN UN SERVEI EXCEL·LENT",10, VAL_GUB)) %>%
  mutate(VAL_GUB = ifelse(VAL_GUB == "NO HO SAP",NA, VAL_GUB)) %>%
  mutate(VAL_GUB = ifelse(VAL_GUB == "NO CONTESTA",NA, VAL_GUB)) %>%  
  mutate(VAL_SEGUR_BARRI = ifelse(VAL_SEGUR_BARRI == "0 = NO HI HA GENS DE SEGURETAT",0, VAL_SEGUR_BARRI)) %>%
  mutate(VAL_SEGUR_BARRI = ifelse(VAL_SEGUR_BARRI == "10 = HI HA MOLTA SEGURETAT",10, VAL_SEGUR_BARRI)) %>%
  mutate(VAL_SEGUR_BARRI = ifelse(VAL_SEGUR_BARRI == "NO HO SAP",NA, VAL_SEGUR_BARRI)) %>%
  mutate(VAL_SEGUR_BARRI = ifelse(VAL_SEGUR_BARRI == "NO CONTESTA",NA, VAL_SEGUR_BARRI)) %>%    
  mutate(VAL_SEGUR = ifelse(VAL_SEGUR == "0 = NO HI HA GENS DE SEGURETAT",0, VAL_SEGUR)) %>%
  mutate(VAL_SEGUR = ifelse(VAL_SEGUR == "10 = HI HA MOLTA SEGURETAT",10, VAL_SEGUR)) %>%
  mutate(VAL_SEGUR = ifelse(VAL_SEGUR == "NO HO SAP",NA, VAL_SEGUR)) %>%
  mutate(VAL_SEGUR = ifelse(VAL_SEGUR == "NO CONTESTA",NA, VAL_SEGUR))

temp$VAL_MOSSOS<-as.numeric(temp$VAL_MOSSOS)
temp$VAL_GUB<-as.numeric(temp$VAL_GUB)
temp$VAL_SEGUR_BARRI<-as.numeric(temp$VAL_SEGUR_BARRI)
temp$VAL_SEGUR<-as.numeric(temp$VAL_SEGUR)

cunas<-data.frame(colSums(is.na(temp)))
cunas<-cunas*100/nrow(temp)
names(cunas) = "% NAs"
t(cunas)
##       NUMQ DISTRICTE VAL_MOSSOS VAL_GUB VAL_SEGUR_BARRI VAL_SEGUR
## % NAs    0         0   12.77407 13.5367        2.478551  5.624404
# Eliminamos los NA
temp <-filter(temp, !is.na(temp[,3]))
temp <-filter(temp, !is.na(temp[,4]))
temp <-filter(temp, !is.na(temp[,5]))
temp <-filter(temp, !is.na(temp[,6]))

VAL_MOSSOS <- temp %>%  
   group_by(DISTRICTE) %>% 
   summarise(mean = mean(VAL_MOSSOS))
names(VAL_MOSSOS)[2] = "VAL_MOSSOS"

VAL_GUB <- temp %>%  
   group_by(DISTRICTE) %>% 
   summarise(mean = mean(VAL_GUB))
names(VAL_GUB)[2] = "VAL_GUB"

VAL_SEGUR_BARRI <- temp %>%  
   group_by(DISTRICTE) %>% 
   summarise(mean = mean(VAL_SEGUR_BARRI))
names(VAL_SEGUR_BARRI)[2] = "VAL_SEGUR_BARRI"

VAL_SEGUR <- temp %>%  
   group_by(DISTRICTE) %>% 
   summarise(mean = mean(VAL_SEGUR))
names(VAL_SEGUR)[2] = "VAL_SEGUR"

df <- cbind(df,VAL_MOSSOS[,2],VAL_GUB[,2],VAL_SEGUR_BARRI[,2],VAL_SEGUR[,2])

Establecimientos de venta de licor y denuncias contra la policía.

df["esta_licor"]<-c(62,97,28,3,11,24,5,10,19,26)
df["denu_poli"]<-c(50276,59391,9768,10022,8723,9400,12041,27604,25608,11243)

Coincidencia distrito de residencia y del hecho.

df["coincide"]<-c(27,46,9,9,9,14,11,36,22,18)

Renta per cápita, 2018.

df["renta"]<-c(15255,24140,23071,19697,29352,14891,17336,20609,18274,32156)

Comisarías de Guardia Urbana, Comisarías de Mossos.

df["co_moss"]<-1
df["co_Gub"]<-c(2,2,1,1,1,1,1,1,2,1)

Colegios y áreas de juego infantil.

df["colegios"]<-c(18,41,27,39,20,37,32,47,35,42)
df["areasjuego"]<-c(26,64,30,73,33,79,70,114,54,47)

Parques y jardines y areas de perros.

df["parques"]<-c(7,49,3,13,8,8,4,12,22,22)
df["arperros"]<-c(3,11,10,13,10,6,12,18,10,18)

Denuncias ordenanza convivencia ciudadana.

df["de_conv_ciu"]<-c(40814,5606,4356,382,274,656,522,14479,4859,1571)

Molestias en espacios públicos (avisos policía).

df["molespub"]<-c(6572,3548,1710,1337,804,2049,1618,3370,2776,1430)

Hechos conocidos por los mossos.

df["conocidos_mossos"]<-c(50436,59552,9722,9996,8627,9226,12017,27481,25658,11118)

Detenciones por la policía.

df["detenciones"]<-c(5844,3964,351,507,684,754,531,1905,2115,421)

Índice de victimización.

df["indicevictimi"]<-c(45.2,33.4,33.1,31.6,26.2,25.5,27.6,32.0,26.0,29.8)

Corregimos las variables por población.

df$comisarias<-colSums(df[,15:16])
df <- df %>%
  mutate(esta_licor = (esta_licor/pop)*100000)%>%
  mutate(denu_poli = (denu_poli/pop)*100000)%>%
  mutate(comisarias = (comisarias/pop)*100000)%>%
  mutate(coincide = (coincide/pop)*100000)%>%  
  mutate(colegios = (colegios/pop)*100000)%>%  
  mutate(areasjuego = (areasjuego/pop)*100000)%>%
  mutate(parques = (parques/pop)*100000)%>%  
  mutate(arperros = (arperros/pop)*100000)%>%
  mutate(de_conv_ciu = (de_conv_ciu/pop)*100000)%>% 
  mutate(molespub = (molespub/pop)*100000)%>% 
  mutate(conocidos_mossos = (conocidos_mossos/pop)*100000)%>%  
  mutate(detenciones = (detenciones/pop)*100000)
df$frec_delitos_lug<-NULL
df$Victimas_res<-NULL
df$encuestadosXdis<-NULL
df$co_moss<-NULL
df$co_Gub<-NULL
hechospoli <- fread('hechos_policia.csv', encoding= 'Latin-1')
hechospoli[,2:3]<-NULL
hechospoli<-as.data.frame(hechospoli[2:11,]) 
# Limpiamos los datos, ya que vienen en formato chr y los pasamos a numerico
for (i in 1:10){
  for(j in 2:76){
    hechospoli[i,j]<-str_replace_all(hechospoli[i,j],"[[:punct:]]", "") # Eliminamos los puntos
    hechospoli[i,j]<-str_replace_all(hechospoli[i,j],"[\\s]+", "")      # Eliminamos los espacios
  }}
for(j in 2:76){
  hechospoli[,j]<-as.numeric(hechospoli[,j])
}

hechospoli <- hechospoli[order(hechospoli$V1),]

propiedad<-rowSums(hechospoli[,c(2,3,5,9,10,21,27:29,48,55:58,68,72,75)])
residenciales<-rowSums(hechospoli[,c(12,22,36)])
sexuales<-rowSums(hechospoli[,c(18,20,38,43,46)])
violentos<-rowSums(hechospoli[,c(4,8,11,15,24,31,41,45,50,52,62,65,67,74,76)])


df<-cbind(df,propiedad,residenciales,sexuales,violentos)
#df<-df[,c(1,3:25)]
#write.csv(df, file="datosg3.csv")
df <- df %>%
  mutate(propiedad = (propiedad/pop)*100000)%>%
  mutate(residenciales = (residenciales/pop)*100000)%>%
  mutate(sexuales = (sexuales/pop)*100000)%>%
  mutate(violentos = (violentos/pop)*100000)
df<-df[,c(1,3:25)]

Gráficos.

ggplot(data=df)+
  geom_point(mapping =  aes(x = distrito, y = propiedad, color = 'propiedad',group = 'propiedad'))+
  geom_line(mapping =  aes(x = distrito, y = propiedad, color = 'propiedad',group = 'propiedad'))+
  
  geom_point(mapping =  aes(x = distrito, y = violentos, color = 'violentos',group = 'violentos'))+
  geom_line(mapping =  aes(x = distrito, y = violentos, color = 'violentos',group = 'violentos'))+
  
  geom_point(mapping =  aes(x = distrito, y = residenciales, color = 'residenciales',group = 'residenciales'))+
  geom_line(mapping =  aes(x = distrito, y = residenciales, color = 'residenciales',group = 'residenciales'))+
  
  geom_point(mapping =  aes(x = distrito, y = sexuales, color = 'sexuales',group = 'sexuales'))+
  geom_line(mapping =  aes(x = distrito, y = sexuales, color = 'sexuales',group = 'sexuales'))+
  
  xlab("Distrito")+
  ylab("Delitos 100.000h")+
  ggtitle("Delitos por distrito")+
  theme (plot.title = element_text(vjust=2, hjust = 1/2),axis.text.x = element_text(face = "bold", angle = 45, hjust = 1, size = 10))

ggplot(data=df)+
  geom_point(mapping =  aes(x = distrito, y = coincide, color = 'coincide',group = 'coincide'))+
  geom_line(mapping =  aes(x = distrito, y = coincide, color = 'coincide',group = 'coincide'))+
  
  geom_point(mapping =  aes(x = distrito, y = VAL_SEGUR_BARRI, color = 'VAL_SEGUR_BARRI',group = 'VAL_SEGUR_BARRI'))+
  geom_line(mapping =  aes(x = distrito, y = VAL_SEGUR_BARRI, color = 'VAL_SEGUR_BARRI',group = 'VAL_SEGUR_BARRI'))+
  
  geom_point(mapping =  aes(x = distrito, y = VAL_SEGUR, color = 'VAL_SEGUR',group = 'VAL_SEGUR'))+
  geom_line(mapping =  aes(x = distrito, y = VAL_SEGUR, color = 'VAL_SEGUR',group = 'VAL_SEGUR'))+
  
  xlab("Distrito")+
  ylab("")+
  ggtitle("Valoración de la seguridad y coincidencia 
          lugar del hecho y de la residencia")+
  theme (plot.title = element_text(vjust=2, hjust = 1/2),axis.text.x = element_text(face = "bold", angle = 45, hjust = 1, size = 10))

ggplot(data=df)+
  geom_point(mapping =  aes(x = distrito, y = renta/1000, color = 'renta en miles',group = 'renta'))+
  geom_line(mapping =  aes(x = distrito, y = renta/1000, color = 'renta en miles',group = 'renta'))+
  
  geom_point(mapping =  aes(x = distrito, y = colegios, color = 'colegios',group = 'colegios'))+
  geom_line(mapping =  aes(x = distrito, y = colegios, color = 'colegios',group = 'colegios'))+
  
  geom_point(mapping =  aes(x = distrito, y = parques, color = 'parques',group = 'parques'))+
  geom_line(mapping =  aes(x = distrito, y = parques, color = 'parques',group = 'parques'))+
  
  geom_point(mapping =  aes(x = distrito, y = areasjuego, color = 'areas de juego',group = 'areasjuego'))+
  geom_line(mapping =  aes(x = distrito, y = areasjuego, color = 'areas de juego',group = 'areasjuego'))+
  
  geom_point(mapping =  aes(x = distrito, y = arperros, color = 'areas perros',group = 'arperros'))+
  geom_line(mapping =  aes(x = distrito, y = arperros, color = 'areas perros',group = 'arperros'))+
  
  xlab("Distrito")+
  ylab("Delitos/100.000h")+
  ggtitle("Delitos por distrito")+
  theme (plot.title = element_text(vjust=2, hjust = 1/2),axis.text.x = element_text(face = "bold", angle = 45, hjust = 1, size = 10))

Matriz de correlaciones.

R<-cor(Filter(is.numeric, df[,c(1:7,9:16,19:24)]), method="pearson")
knitr::kable(R, digits =2,caption = "Correlaciones")
Correlaciones
porex VAL_MOSSOS VAL_GUB VAL_SEGUR_BARRI VAL_SEGUR esta_licor coincide renta colegios areasjuego parques arperros de_conv_ciu molespub indicevictimi comisarias propiedad residenciales sexuales violentos
porex 1.00 -0.48 -0.01 -0.89 -0.22 0.87 0.87 -0.47 -0.58 -0.48 0.00 -0.66 0.96 0.98 0.85 0.12 0.96 0.85 0.98 0.98
VAL_MOSSOS -0.48 1.00 0.30 0.29 0.43 -0.60 -0.73 -0.41 0.26 0.59 -0.64 0.01 -0.45 -0.43 -0.48 -0.24 -0.62 -0.04 -0.54 -0.49
VAL_GUB -0.01 0.30 1.00 -0.07 0.20 0.01 -0.11 -0.12 0.48 0.35 -0.27 -0.04 0.04 0.06 -0.16 0.38 -0.17 0.34 -0.01 -0.02
VAL_SEGUR_BARRI -0.89 0.29 -0.07 1.00 0.06 -0.58 -0.74 0.64 0.52 0.16 0.13 0.68 -0.88 -0.87 -0.72 0.07 -0.78 -0.89 -0.93 -0.89
VAL_SEGUR -0.22 0.43 0.20 0.06 1.00 -0.36 -0.25 -0.42 -0.17 0.73 -0.14 -0.25 -0.27 -0.25 -0.35 -0.17 -0.22 0.12 -0.21 -0.16
esta_licor 0.87 -0.60 0.01 -0.58 -0.36 1.00 0.83 -0.11 -0.47 -0.72 0.24 -0.49 0.82 0.84 0.81 0.24 0.91 0.60 0.80 0.83
coincide 0.87 -0.73 -0.11 -0.74 -0.25 0.83 1.00 -0.12 -0.55 -0.47 0.31 -0.44 0.84 0.84 0.76 0.06 0.93 0.59 0.89 0.90
renta -0.47 -0.41 -0.12 0.64 -0.42 -0.11 -0.12 1.00 0.57 -0.24 0.53 0.81 -0.38 -0.42 -0.21 0.33 -0.28 -0.74 -0.43 -0.43
colegios -0.58 0.26 0.48 0.52 -0.17 -0.47 -0.55 0.57 1.00 0.30 -0.12 0.81 -0.40 -0.43 -0.43 0.53 -0.60 -0.41 -0.53 -0.54
areasjuego -0.48 0.59 0.35 0.16 0.73 -0.72 -0.47 -0.24 0.30 1.00 -0.49 0.19 -0.38 -0.41 -0.50 -0.02 -0.55 -0.09 -0.43 -0.40
parques 0.00 -0.64 -0.27 0.13 -0.14 0.24 0.31 0.53 -0.12 -0.49 1.00 0.05 -0.12 -0.10 -0.02 -0.17 0.18 -0.26 0.09 0.01
arperros -0.66 0.01 -0.04 0.68 -0.25 -0.49 -0.44 0.81 0.81 0.19 0.05 1.00 -0.47 -0.52 -0.41 0.45 -0.54 -0.73 -0.60 -0.57
de_conv_ciu 0.96 -0.45 0.04 -0.88 -0.27 0.82 0.84 -0.38 -0.40 -0.38 -0.12 -0.47 1.00 0.99 0.88 0.27 0.92 0.82 0.95 0.97
molespub 0.98 -0.43 0.06 -0.87 -0.25 0.84 0.84 -0.42 -0.43 -0.41 -0.10 -0.52 0.99 1.00 0.85 0.27 0.93 0.85 0.96 0.98
indicevictimi 0.85 -0.48 -0.16 -0.72 -0.35 0.81 0.76 -0.21 -0.43 -0.50 -0.02 -0.41 0.88 0.85 1.00 0.13 0.85 0.58 0.80 0.83
comisarias 0.12 -0.24 0.38 0.07 -0.17 0.24 0.06 0.33 0.53 -0.02 -0.17 0.45 0.27 0.27 0.13 1.00 0.15 0.09 0.10 0.17
propiedad 0.96 -0.62 -0.17 -0.78 -0.22 0.91 0.93 -0.28 -0.60 -0.55 0.18 -0.54 0.92 0.93 0.85 0.15 1.00 0.71 0.94 0.97
residenciales 0.85 -0.04 0.34 -0.89 0.12 0.60 0.59 -0.74 -0.41 -0.09 -0.26 -0.73 0.82 0.85 0.58 0.09 0.71 1.00 0.84 0.84
sexuales 0.98 -0.54 -0.01 -0.93 -0.21 0.80 0.89 -0.43 -0.53 -0.43 0.09 -0.60 0.95 0.96 0.80 0.10 0.94 0.84 1.00 0.98
violentos 0.98 -0.49 -0.02 -0.89 -0.16 0.83 0.90 -0.43 -0.54 -0.40 0.01 -0.57 0.97 0.98 0.83 0.17 0.97 0.84 0.98 1.00
corrplot(cor(Filter(is.numeric, df), use="pairwise", method="pearson"), method = "circle",type = "upper", number.cex = 0.4)

options(ggrepel.max.overlaps = Inf)
fit<-PCA(R,scale.unit=TRUE,ncp=2,graph=TRUE)

eig<-get_eigenvalue(fit)
knitr::kable(eig, digits =2,caption = "Autovalores") 
Autovalores
eigenvalue variance.percent cumulative.variance.percent
Dim.1 14.20 70.99 70.99
Dim.2 3.52 17.58 88.57
Dim.3 1.66 8.32 96.89
Dim.4 0.34 1.71 98.60
Dim.5 0.20 1.00 99.60
Dim.6 0.06 0.29 99.89
Dim.7 0.01 0.07 99.96
Dim.8 0.01 0.03 99.99
Dim.9 0.00 0.01 100.00
Dim.10 0.00 0.00 100.00
Dim.11 0.00 0.00 100.00
Dim.12 0.00 0.00 100.00
Dim.13 0.00 0.00 100.00
Dim.14 0.00 0.00 100.00
Dim.15 0.00 0.00 100.00
Dim.16 0.00 0.00 100.00
Dim.17 0.00 0.00 100.00
Dim.18 0.00 0.00 100.00
Dim.19 0.00 0.00 100.00
fviz_eig(fit,addlabels=TRUE)

Con 2 dimensiones explicamos más del 90.32% de la varianza. A partir de la 4ª dimensión encontramos autovalores inferiores a 1. A continuación podemos ver cómo correlacionan las variables con cada componente.

var<-get_pca_var(fit)
knitr::kable(var$cor, digits =2,caption = "Correlaciones de la CP con las variables") 
Correlaciones de la CP con las variables
Dim.1 Dim.2
porex 0.99 0.08
VAL_MOSSOS -0.78 0.61
VAL_GUB -0.36 0.59
VAL_SEGUR_BARRI -0.96 -0.25
VAL_SEGUR -0.47 0.76
esta_licor 0.98 -0.15
coincide 0.99 -0.12
renta -0.63 -0.77
colegios -0.91 -0.18
areasjuego -0.80 0.57
parques 0.19 -0.82
arperros -0.87 -0.42
de_conv_ciu 0.99 0.07
molespub 0.99 0.08
indicevictimi 0.99 -0.06
comisarias -0.05 -0.37
propiedad 1.00 -0.05
residenciales 0.91 0.40
sexuales 1.00 0.06
violentos 0.99 0.07
corrplot(var$cos2,is.corr=FALSE)

rownames(df)<-(df$distrito)
num<-Filter(is.numeric, df[,c(1:7,9:16,19:24)])
fit<-PCA(num,scale.unit=TRUE,ncp=2,graph=TRUE)

fviz_pca_biplot(fit,axes = c(1, 2), repel = TRUE, col.var = "#2E9FDF",col.ind = "#696969")

fviz_contrib(fit, choice="var", axes = 1)

fviz_contrib(fit, choice="var", axes = 2)

fviz_pca_var(fit, axes = c(1, 2), col.var="cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),repel = TRUE )

knitr::kable(var$contrib, digits =2,caption = "Contribuciones")
Contribuciones
Dim.1 Dim.2
porex 6.97 0.17
VAL_MOSSOS 4.23 10.43
VAL_GUB 0.93 9.73
VAL_SEGUR_BARRI 6.52 1.83
VAL_SEGUR 1.58 16.49
esta_licor 6.78 0.63
coincide 6.88 0.38
renta 2.82 16.70
colegios 5.84 0.95
areasjuego 4.49 9.11
parques 0.24 19.20
arperros 5.39 5.13
de_conv_ciu 6.84 0.13
molespub 6.85 0.19
indicevictimi 6.88 0.09
comisarias 0.02 3.91
propiedad 7.01 0.06
residenciales 5.78 4.63
sexuales 6.98 0.10
violentos 6.96 0.15
corrplot(var$contrib,is.corr=FALSE)

Representamos un mapa de calor de la matriz de datos, estandarizado y sin estandarizar para ver si se detectan inicialmente grupos de distritos.

num<-Filter(is.numeric, df[,c(1:7,9:16,19:24)])
numest<-scale(num) #Primero estandarizamos los datos para tener media igual a cero
heatmaply(num, seriate = "mean", row_dend_left = TRUE, plot_method = "plotly")      
heatmaply(numest, seriate = "mean", row_dend_left = TRUE, plot_method = "plotly")

¡